/***************************************************************************//**
 * @file     csa37f7x_iwdt.h
 * @version  V1.0.0
 * @author   Chipsea MCU Group
 * @date     2020-10-23 PM
 * @brief    该文件包含了IWDT各功能参数的定义和函数接口声明
 * 
 * @copyright Copyright (C) 2020 Chipsea Technologies Corp. All rights reserved.
 ****************************************************************************
* @attention
 *	硬件平台: CSA37F70 评估板V1.0 \n
 *	SDK版本：  CSA37F7X_SDK_1.0.0
 * 
 * @par 修改日志:
 * <table>
 * <tr><th>Date 	   <th>Version	<th>Author	            <th>Description
 * <tr><td>2020/10/21  <td>1.0.0    <td>Chipsea MCU Group	<td>创建初始版本
 * </table>
 *
 *****************************************************************************/

#ifndef __CSA37F7X_IWDT_H__
#define __CSA37F7X_IWDT_H__

// Include external header file.
#include "csa37f7x.h"


#ifdef __cplusplus
extern "C" {
#endif

#ifndef __CSA37F70__
/** @addtogroup IWDT 独立看门狗(IWDT)
  内嵌独立看门狗，集成的看门狗外设是用来解决某些硬件故障问题的，当它的定时计数值达到
了预设的门限的时候，它会触发一个系统复位请求。独立看门狗由它自己专有的低速时钟来驱动，
因此就算是主时钟失效了，它仍然能保持工作状态。<br>
###特性: 
    - 看门狗复位定时固定为60s
    - 由一个独立的振荡器2K LIRC驱动 ( 在深度睡眠模式状态下仍可操作 )
    - 软件开启后无法关闭
    - 只有上电/掉电复位/复位脚复位 可以复位IWDG_S
  @{
*/
#else
/** @addtogroup IWDT 独立看门狗(IWDT)
  内嵌独立看门狗，集成的看门狗外设是用来解决某些硬件故障问题的，当它的定时计数值达到
了预设的门限的时候，它会触发一个系统复位请求。独立看门狗由它自己专有的低速时钟来驱动，
因此就算是主时钟失效了，它仍然能保持工作状态。<br>
###特性: 
   -12位自由运行的向下计数器
   -由一个独立的 振荡器2K LIRC驱动 ( 在深度睡眠模式状态下仍可操作 )
   -软件开启后无法关闭
  @{
*/
#endif

#ifdef __CSA37F70__
/**
  * @brief 看门狗预分频值
  */
typedef enum
{
    IWDT_CLK_PRESCALE_4 = 0x00,     /*!<4分频        */
    IWDT_CLK_PRESCALE_8 = 0x01,     /*!<8分频        */
    IWDT_CLK_PRESCALE_16 = 0x02,    /*!<16分频       */
    IWDT_CLK_PRESCALE_32 = 0x03,    /*!<32分频       */
    IWDT_CLK_PRESCALE_64 = 0x04,    /*!<64分频       */
    IWDT_CLK_PRESCALE_128 = 0x05,   /*!<128分频      */
    IWDT_CLK_PRESCALE_256 = 0x06,   /*!<256分频      */

}iwdt_clk_prescale_t;

/**
  * @brief 看门狗初始化结构体
  */
typedef struct
{
    iwdt_clk_prescale_t iwdt_clk_prescale;      /*!<看门狗预分频初始化选择 */
    uint32_t iwdt_upper_data;                   /*!<看门狗计数器窗口值配置 */
    uint32_t iwdt_reload_data;                  /*!<看门狗重载值配置 */

} iwdt_config_t;

/**
  * @brief 看门狗状态位
  */
typedef enum
{
    WVU = 0x02,      /*!<看门狗计数器窗值更新 */
    RVU = 0x01,      /*!<看门狗计数器重载值更新 */ 
    PVU = 0x00,      /*!<看门狗计数器预分频值更新 */
}iwdt_status_t;

/**@brief		看门狗状态对应状态值位获取

 *@param[in]    iwdt_status		看门狗状态位选择
 * @return		返回看门狗状态位对应的状态值
*/
uint8_t iwdt_status_get(iwdt_status_t iwdt_status);

/**@brief		看门狗初始化

 *@param[in]	p_iwdt_config 	看门狗初始化配置结构体
 * @return		无
*/
void iwdt_init ( iwdt_config_t *p_iwdt_config);

/**@brief		看门狗计数窗口值读取

 * @return		返回读取的窗口计数值
*/
uint16_t iwdt_counter_window_value_read(void);

/**@brief		看门狗计数重载值读取

 * @return		返回读取的计数重载值
*/
uint16_t iwdt_counter_reload_value_read(void);

/**@brief		看门狗预分频值获取

 * @return		返回看门狗预分频值
*/
uint8_t iwdt_preassigned_frequency_get(void);
#endif  //__CSA37F70__

/**@brief		看门狗启动

 * @return		无
*/
void iwdt_start(void);

/**@brief		看门狗喂狗

 * @return		无
*/
void iwdt_feed_dog(void);

/*@}*/ /* end of group IWDT */

#ifdef __cplusplus
}
#endif

#endif  //__CSA37F7X_IWDT_H__

